package com.hrt.day06.sort

/**
 * 排序sortBy
 * def sortBy[B](f: A => B)(implicit ord: Ordering[B])
 * 第一个参数是排序的指标 第二个是排序的规则
 */
class Person(val age: Int, val name: String){
    override def toString: String = s"[age =$age , name =$name ]"
}
object Sort2 {
    def main(args: Array[String]): Unit = {
        /*val list1 = List(30, 50, 70, 60, 10, 20)
        val list2: List[Int] = list1.sortBy(x => x)(Ordering.Int.reverse)
        println(list2)*/
        
        //        val list1 = List("zzzzz", "hello", "world", "hello", "aaa", "b")
        //        val list2: List[String] = list1.sortBy(x => x)
        // 按照字符串的长度升序进行排列
        //        val list2 = list1.sortBy(x => x.length)(Ordering.Int.reverse)
        //        val list2 = list1.sortBy(x => -x.length)
        //        val list2 = list1.sortBy(_.length)
        // 先按照长度升序排, 长度相等的时候使用字母表的升序排
        // 多个指标, 就把这多个指标放在元组中返回
        //        val list2= list1.sortBy(x => (x.length, x))
        // 先按照长度降序排, 长度相等的时候使用字母表的升序排
        //        val list2 = list1.sortBy(x => (x.length, x))(Ordering.Tuple2(Ordering.Int.reverse, Ordering.String))
        // 先按照长度升序, 长度相等的时候使用字母表的降序
        //        val list2 = list1.sortBy(x => (x.length, x))(Ordering.Tuple2(Ordering.Int, Ordering.String.reverse))
        val list = List(new Person(10, "a"), new Person(30, "d"), new Person(10, "b"), new Person(8, "c"))
        // 年龄升序, 年龄等姓名升序
//        val list2 = list.sortBy(user => (user.age, user.name))
        val list2 = list.sortBy(user => (user.age, user.name))(Ordering.Tuple2(Ordering.Int, Ordering.String.reverse))
        println(list2)
    }
}

/**
sortBy
    不需要提供任何的逻辑代码, 只需要指定要排序的指标
        scala
 */